{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "# https://www.tinymind.com/ai100/notebooks/74\n",
    "\n",
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "from tensorflow.examples.tutorials.mnist import input_data\n",
    "from matplotlib import pyplot as plt\n",
    "%matplotlib inline\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "tf.logging.set_verbosity(tf.logging.INFO)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From <ipython-input-3-3c7c83c623ca>:1: read_data_sets (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use alternatives such as official/mnist/dataset.py from tensorflow/models.\n",
      "WARNING:tensorflow:From /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/tensorflow/contrib/learn/python/learn/datasets/mnist.py:260: maybe_download (from tensorflow.contrib.learn.python.learn.datasets.base) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please write your own downloading logic.\n",
      "WARNING:tensorflow:From /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/tensorflow/contrib/learn/python/learn/datasets/mnist.py:262: extract_images (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use tf.data to implement this functionality.\n",
      "Extracting ./MNIST_data/train-images-idx3-ubyte.gz\n",
      "WARNING:tensorflow:From /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/tensorflow/contrib/learn/python/learn/datasets/mnist.py:267: extract_labels (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use tf.data to implement this functionality.\n",
      "Extracting ./MNIST_data/train-labels-idx1-ubyte.gz\n",
      "Extracting ./MNIST_data/t10k-images-idx3-ubyte.gz\n",
      "Extracting ./MNIST_data/t10k-labels-idx1-ubyte.gz\n",
      "WARNING:tensorflow:From /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/tensorflow/contrib/learn/python/learn/datasets/mnist.py:290: DataSet.__init__ (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use alternatives such as official/mnist/dataset.py from tensorflow/models.\n",
      "(55000, 784)\n",
      "(55000,)\n",
      "(5000, 784)\n",
      "(5000,)\n",
      "(10000, 784)\n",
      "(10000,)\n"
     ]
    }
   ],
   "source": [
    "mnist = input_data.read_data_sets('./MNIST_data')\n",
    "\n",
    "print(mnist.train.images.shape)\n",
    "print(mnist.train.labels.shape)\n",
    "\n",
    "print(mnist.validation.images.shape)\n",
    "print(mnist.validation.labels.shape)\n",
    "\n",
    "print(mnist.test.images.shape)\n",
    "print(mnist.test.labels.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(8,8))\n",
    "\n",
    "for idx in range(16):\n",
    "    plt.subplot(4,4, idx+1)\n",
    "    plt.axis('off')\n",
    "    plt.title('[{}]'.format(mnist.train.labels[idx]))\n",
    "    plt.imshow(mnist.train.images[idx].reshape((28,28)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 接下来，定义用于训练的网络，首先定义网络的输入。\n",
    "\n",
    "#  这里我们直接使用上面的数据作为输入，所以定义两个placeholder分别用于图像和lable数据，另外，定义一个float类型的变量用于设置学习率。\n",
    "\n",
    "# 为了让网络更高效的运行，多个数据会被组织成一个batch送入网络，两个placeholder的第一个维度就是batchsize，\n",
    "# 因为我们这里还没有确定batchsize，所以第一个维度留空。\n",
    "\n",
    "x = tf.placeholder(\"float\", [None, 784])\n",
    "y = tf.placeholder(\"int64\", [None])\n",
    "learning_rate = tf.placeholder(\"float\")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/tensorflow/python/framework/op_def_library.py:263: colocate_with (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Colocations handled automatically by placer.\n"
     ]
    }
   ],
   "source": [
    "def initialize(shape, stddev=0.1):\n",
    "  return tf.truncated_normal(shape, stddev=0.1)\n",
    "\n",
    "L1_units_count = 100\n",
    "W_1 = tf.Variable(initialize([784, L1_units_count]))\n",
    "b_1 = tf.Variable(initialize([L1_units_count]))\n",
    "logits_1 = tf.matmul(x, W_1) + b_1\n",
    "output_1 = tf.nn.relu(logits_1)\n",
    "\n",
    "L2_units_count = 10 \n",
    "W_2 = tf.Variable(initialize([L1_units_count, L2_units_count]))\n",
    "b_2 = tf.Variable(initialize([L2_units_count]))\n",
    "logits_2 = tf.matmul(output_1, W_2) + b_2  \n",
    "\n",
    "logits = logits_2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 接下来定义loss和用于优化网络的优化器。loss计算使用了sparse_softmax_cross_entropy_with_logits, \n",
    "# 这样做的好处是labels可以不用手动做one_hot省了一些麻烦。这里使用了sgd优化器，学习率为可以根据需要设定。\n",
    "\n",
    "# 试试看，增大减小学习率，换个优化器再进行训练会发生什么。\n",
    "cross_entropy_loss = tf.reduce_mean(\n",
    "    tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits, labels=y))\n",
    "\n",
    "optimizer = tf.train.GradientDescentOptimizer(\n",
    "    learning_rate=learning_rate).minimize(cross_entropy_loss)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "# 需要注意的是，上面的网络，最后输出的是未经softmax的原始logits，而不是概率分布， 要想看到概率分布，还需要做一下softmax。\n",
    "\n",
    "# 将输出的结果与正确结果进行对比，即可得到我们的网络输出结果的准确率。\n",
    "\n",
    "pred = tf.nn.softmax(logits)\n",
    "correct_pred = tf.equal(tf.argmax(pred, 1), y)\n",
    "accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "# saver用于保存或恢复训练的模型。\n",
    "batch_size = 32\n",
    "trainig_step = 1000\n",
    "\n",
    "saver = tf.train.Saver()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "after 100 training steps, the loss is 0.853694, the validation accuracy is 0.8362\n",
      "after 200 training steps, the loss is 0.52112, the validation accuracy is 0.9038\n",
      "after 300 training steps, the loss is 0.395055, the validation accuracy is 0.9188\n",
      "after 400 training steps, the loss is 0.15273, the validation accuracy is 0.9306\n",
      "after 500 training steps, the loss is 0.217978, the validation accuracy is 0.9298\n",
      "after 600 training steps, the loss is 0.191941, the validation accuracy is 0.9432\n",
      "WARNING:tensorflow:From /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/tensorflow/python/training/saver.py:966: remove_checkpoint (from tensorflow.python.training.checkpoint_management) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use standard file APIs to delete files with this prefix.\n",
      "after 700 training steps, the loss is 0.0430938, the validation accuracy is 0.9504\n",
      "after 800 training steps, the loss is 0.0992073, the validation accuracy is 0.95\n",
      "after 900 training steps, the loss is 0.205526, the validation accuracy is 0.9424\n",
      "the training is finish!\n",
      "the test accuarcy is: 0.9496\n"
     ]
    }
   ],
   "source": [
    "# 以上定义的所有操作，均为计算图，也就是仅仅是定义了网络的结构，实际需要运行的话，还需要创建一个session，并将数据填入网络中。\n",
    "with tf.Session() as sess:\n",
    "    sess.run(tf.global_variables_initializer())\n",
    "\n",
    "    #定义验证集与测试集\n",
    "    validate_data = {\n",
    "        x: mnist.validation.images,\n",
    "        y: mnist.validation.labels,\n",
    "    }\n",
    "    test_data = {x: mnist.test.images, y: mnist.test.labels}\n",
    "\n",
    "    for i in range(trainig_step):\n",
    "        xs, ys = mnist.train.next_batch(batch_size)\n",
    "        _, loss = sess.run(\n",
    "            [optimizer, cross_entropy_loss],\n",
    "            feed_dict={\n",
    "                x: xs,\n",
    "                y: ys,\n",
    "                learning_rate: 0.3\n",
    "            })\n",
    "\n",
    "        #每100次训练打印一次损失值与验证准确率\n",
    "        if i > 0 and i % 100 == 0:\n",
    "            validate_accuracy = sess.run(accuracy, feed_dict=validate_data)\n",
    "            print(\n",
    "                \"after %d training steps, the loss is %g, the validation accuracy is %g\"\n",
    "                % (i, loss, validate_accuracy))\n",
    "            saver.save(sess, './model.ckpt', global_step=i)\n",
    "\n",
    "    print(\"the training is finish!\")\n",
    "    #最终的测试准确率\n",
    "    acc = sess.run(accuracy, feed_dict=test_data)\n",
    "    print(\"the test accuarcy is:\", acc)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/tensorflow/python/training/saver.py:1266: checkpoint_exists (from tensorflow.python.training.checkpoint_management) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use standard file APIs to check for files with this prefix.\n",
      "INFO:tensorflow:Restoring parameters from ./model.ckpt-900\n",
      "0.9375\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "# 下面，用我们训练的模型做一个测试。\n",
    "\n",
    "\n",
    "with tf.Session() as sess:\n",
    "    ckpt = tf.train.get_checkpoint_state('./')\n",
    "    if ckpt and ckpt.model_checkpoint_path:\n",
    "        saver.restore(sess, ckpt.model_checkpoint_path)\n",
    "        final_pred, acc = sess.run(\n",
    "            [pred, accuracy],\n",
    "            feed_dict={\n",
    "                x: mnist.test.images[:16],\n",
    "                y: mnist.test.labels[:16]\n",
    "            })\n",
    "        orders = np.argsort(final_pred)\n",
    "        plt.figure(figsize=(8, 8))\n",
    "        print(acc)\n",
    "        for idx in range(16):\n",
    "            order = orders[idx, :][-1]\n",
    "            prob = final_pred[idx, :][order]\n",
    "            plt.subplot(4, 4, idx + 1)\n",
    "            plt.axis('off')\n",
    "            plt.title('{}: [{}]-[{:.1f}%]'.format(mnist.test.labels[idx],\n",
    "                                                  order, prob * 100))\n",
    "            plt.imshow(mnist.test.images[idx].reshape((28, 28)))\n",
    "\n",
    "    else:\n",
    "        pass"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "2.模型结构理解\n",
    "输入和输出层\n",
    "x = tf.placeholder(\"float\", [None, 784])\n",
    "y = tf.placeholder(\"int64\", [None])\n",
    "x是输入数据，y为输出数据，输入层有32个节点，由batch_size决定，输出层也有32个节点。\n",
    "隐层\n",
    "L1_units_count = 100\n",
    "L2_units_count = 10 \n",
    "有两层隐层，分别有100 和 10 个节点。\n",
    "\n",
    "3.\n",
    "4.对计算图的理解\n",
    "（1）Tensorflow 是用于表示某种类型的计算抽象（称为“计算图”）的框架。我们用 Python 操作 Tensorflow 时，\n",
    "我们用 Python 代码做的第一件事是组装计算图。之后我们的第二个任务就是与它进行交互（使用 Tensorflow 的“会话”）。\n",
    "计算图不在变量内部，它处在全局命名空间内。\n",
    "（2）会话的作用是处理内存分配和优化，使我们能够实际执行由图形指定的计算。\n",
    "可以将计算图想象为我们想要执行的计算的“模板”：它列出了所有的步骤。\n",
    "为了使用这个图表，我们还需要发起一个会话，它使我们能够实际地完成任务。\n",
    "例如，遍历模板的所有节点来分配一组用于存储计算输出的存储器。\n",
    "综上：为了使用 Tensorflow 进行各种计算，我们既需要图也需要会话。\n",
    "5.解释这⾥的模型为什么效果⽐较差\n",
    "（1）训练次数少\n",
    "（2）没有进行参数调优\n",
    "（3）没有对不同的优化器进行比较，选择准确率最高的优化器\n",
    "\n",
    "\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
